package com.ruoyi.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.dto.DemandChangeRequestAuditDTO;
import com.ruoyi.system.dto.DemandChangeRequestCreateDTO;
import com.ruoyi.system.dto.DemandChangeRequestQueryDTO;
import com.ruoyi.system.entity.DemandChangeRequestDO;
import com.ruoyi.system.vo.DemandChangeRequestVO;

import java.util.List;

/**
 * 需求变更申请服务接口
 * 
 * @author ruoyi
 * @since 2024-01-01
 */
public interface IDemandChangeRequestService extends IService<DemandChangeRequestDO> {

    /**
     * 创建变更申请（草稿）
     * 
     * @param createDTO 创建DTO
     * @param designerId 设计师ID
     * @return 是否成功
     */
    boolean createDraft(DemandChangeRequestCreateDTO createDTO, Long designerId);

    /**
     * 提交审核
     * 
     * @param requestId 申请ID
     * @param designerId 设计师ID
     * @return 是否成功
     */
    boolean submitForAudit(Long requestId, Long designerId);

    /**
     * 更新草稿
     * 
     * @param requestId 申请ID
     * @param createDTO 创建DTO
     * @param designerId 设计师ID
     * @return 是否成功
     */
    boolean updateDraft(Long requestId, DemandChangeRequestCreateDTO createDTO, Long designerId);

    /**
     * 分页查询变更申请列表
     * 
     * @param queryDTO 查询条件
     * @return 变更申请列表
     */
    List<DemandChangeRequestVO> getChangeRequestList(DemandChangeRequestQueryDTO queryDTO);

    /**
     * 获取变更申请详情
     * 
     * @param requestId 申请ID
     * @return 变更申请详情
     */
    DemandChangeRequestVO getChangeRequestDetail(Long requestId);

    /**
     * 审核变更申请
     * 
     * @param auditDTO 审核DTO
     * @param auditorId 审核人ID
     * @return 是否成功
     */
    boolean auditChangeRequest(DemandChangeRequestAuditDTO auditDTO, Long auditorId);

    /**
     * 通过审核
     * 
     * @param auditDTO 审核DTO
     * @param auditorId 审核人ID
     * @return 是否成功
     */
    boolean approveChangeRequest(DemandChangeRequestAuditDTO auditDTO, Long auditorId);

    /**
     * 驳回审核
     * 
     * @param auditDTO 审核DTO
     * @param auditorId 审核人ID
     * @return 是否成功
     */
    boolean rejectChangeRequest(DemandChangeRequestAuditDTO auditDTO, Long auditorId);

    /**
     * 取消变更申请
     * 
     * @param requestId 申请ID
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean cancelChangeRequest(Long requestId, Long operatorId);

}
